/// 投影矩阵相关算法
///
#ifndef CERESSOLPROJMATRIX_H
#define CERESSOLPROJMATRIX_H

#include <Eigen/Core>
#include <opencv2/core.hpp>
#include <memath/matrixd.h>

class CeresSolProjMatrix
{
public:
    /// [R,t]矩阵和 旋转角 x,y 求解 u, v, f, z
    /// 根据H矩阵求解 H=A*[R,t] 中的部分参数
    static int solve(double x, double y,
                     double r11, double r12, double r13,
                     double r21, double r22, double r23,
                     double &u, double &v, double &f, double &z);

    /// 生成投影矩阵P  [u, v, 1]^T = P * [x, y, z, 1]
    static bool calProjectionMatrix_UVfrW(std::vector<Eigen::Vector3d> &ptsPlane1_W, std::vector<Eigen::Vector3d> &ptsPlane2_W,
                                          std::vector<cv::Point2f> &p2fPlane1_uv, std::vector<cv::Point2f> &p2fPlane2_uv,
                                          Matrix4d &matrixP);

    /// 生成投影矩阵P  [u, v, 1]^T = P * [x, y, z, 1], 用ceres方法
    static bool calProjectionMatrix_UVfrW(std::vector<Eigen::Vector3d> &pts_W, std::vector<cv::Point2f> &p2f_uv,
                                   Matrix4d &matrixP);
};

#endif // CERESSOLPROJMATRIX_H
